package com.jinke.api.modules.ums.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jinke.api.common.api.CommonPage;
import com.jinke.api.common.api.CommonResult;
import com.jinke.api.domain.AdminUserDetails;
import com.jinke.api.modules.app.controller.param.CompanySellerProfitParam;
import com.jinke.api.modules.app.controller.param.SellerUserDayParam;
import com.jinke.api.modules.app.response.TrackSummaryVO;
import com.jinke.api.modules.ums.dto.*;
import com.jinke.api.modules.ums.model.Channel;
import com.jinke.api.modules.ums.model.UmsAdmin;
import com.jinke.api.modules.ums.model.UmsRole;
import com.jinke.api.modules.ums.request.AllotChannelRequest;
import com.jinke.api.modules.ums.request.UserReleaseEarnestRequest;
import com.jinke.api.modules.ums.vo.SellerVo;
import com.jinke.api.modules.ums.vo.SimpleUser;
import com.jinke.api.modules.ums.vo.UmsAdminVO;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 后台管理员管理Service
 * Created by macro on 2018/4/26.
 */
public interface UmsAdminService extends IService<UmsAdmin> {
    @Transactional
    int updateRole(Integer adminId, List<Integer> roleIds);

    /**
     * 根据用户名获取后台管理员
     */
    UmsAdmin getAdminByKeyword(String username);

    /**
     * 注册功能
     */
    UmsAdmin register(UmsAdminParam umsAdminParam);

    /**
     * 登录功能
     *
     * @param username 用户名
     * @param password 密码
     * @return 生成的JWT的token
     */
    String login(String username, String password);

    String generateTokenByUserId(Integer userId);

    /**
     * 刷新token的功能
     *
     * @param oldToken 旧的token
     */
    String refreshToken(String oldToken);

    /**
     * 根据用户名或昵称分页查询用户
     */
    Page<UmsAdmin> list(UmsAdminListParam request);

    /**
     * 用户管理查询
     * @param request
     * @return
     */
    CommonResult<CommonPage<UmsAdminVO>> listVo(UmsAdminListParam request);

    /**
     * 修改指定用户信息
     */
    boolean update(Integer id, UmsAdmin admin);

    /**
     * 删除指定用户
     */
    boolean delete(Integer id);

    /**
     * 修改密码
     */
    int updatePassword(UpdateAdminPasswordParam updatePasswordParam);

    /**
     * 获取用户信息
     */
    AdminUserDetails loadUserByUsername(String username);

    AdminUserDetails loadUserById(Integer id);

    /**
     * 根据给定的用户ID列表 ids，获取相应的用户信息，并将其以映射的形式返回
     *
     * @param ids
     * @return
     */
    Map<Integer, SimpleUser> getMaps(List<Integer> ids);

    List<Integer> searchIds(String keyword);

    BigDecimal getRate(Integer rate);

    BigDecimal getBalance(Integer id);

    /**
     * 获取用户对于角色
     */
    List<UmsRole> getRoleList(Integer adminId);

    /**
     * 分配承运商
     * @param request
     * @return
     */
    CommonResult<CommonPage<Channel>> allotChannel(AllotChannelRequest request);

    CommonResult<String> down(UmsAdminListParam request);

    CommonResult buildToken(Integer id);

    CommonResult releaseEarnest(UserReleaseEarnestRequest request);

    /**
     * 释放风险保证金
     *
     * @param st 操作数据集合
     */
    void releaseDeposit(List<UserReleaseEarnestRequest> st);

    /**
     * 订单取消释放保证金
     *
     * @param userId  用户id
     * @param rate    订单金额
     * @param earnest 保证金金额
     * @param orderNo 订单号
     */
    void releaseDepositByCancelAudit(Integer userId, BigDecimal rate, BigDecimal earnest, String orderNo);

    /**
     * 释放当前用户的所有保证金
     *
     * @param userId 用户id
     */
    CommonResult releaseEarnestAllByUserId(Integer userId);

    /**
     * 发送邮件
     * @param mail 邮件信息
     * @return result
     */
    CommonResult sendMail(SendMail mail);

    /**
     * 登录user如果是管理员，查看当日消费前十的用户的消费和订单数，
     * 如果user是销售，查看自己的用户的当日消费图和折线图，
     * 如果user是普通 用户就查看自己的消费和订单数
     * @return result
     */
    CommonResult<StatisticsOrderDto> getSalesAndOrdersByRole();

    CommonResult<List<SellerUserGroupDto>> getSellerUserOrderStatistics(SellerUserDayParam sellerUserDayParam);

    CommonResult<List<SellerPerformanceDto>> getSellerPerformanceStatistics(CompanySellerProfitParam choseMonth);

    CommonResult<List<SellerVo>> getAllEnableSellers();

    UmsAdmin overseasUserRegister(OverseasUserAddParam overseasUserAddParam);

    void checkSummaryThenSendMSG(String today, String yesterday, List<TrackSummaryVO> yesterdaySummary);
}
